package com.mzj.saas.mservice.face.service;

import com.alibaba.fastjson.JSON;
import com.aliyuncs.AcsResponse;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.RpcAcsRequest;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.facebody.model.v20191230.CompareFaceRequest;
import com.aliyuncs.facebody.model.v20191230.CompareFaceResponse;
import com.mzj.saas.config.face.FaceConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 阿里云-人脸比对1:1
 * 
 * @author shun
 * @createDate: 2021年9月27日 下午6:27:50
 * @version: 1.0
 *
 */
@Service
public class FaceThanService {
	private static final Logger log = LoggerFactory.getLogger(FaceThanService.class);
	@Autowired
	private IAcsClient client;
	@Autowired
	private FaceConfig faceConfig;

	/**
	 * 人脸比对
	 * 
	 * @param imageDataA
	 *            比对图片1
	 * @param imageDataB
	 *            比对图片2
	 * @return
	 * @author shun
	 * @date 2021年9月27日
	 */
	public Boolean FaceCompareFace(String imageDataA, String imageDataB) {
		log.info("FaceThanService, 人脸比对.");
		try {
			CompareFaceRequest req = new CompareFaceRequest();
			req.setImageDataA(imageDataA);
			req.setImageDataB(imageDataB);
			// 质量分阈值，取值范围[0.0,100.0]。0.0或空则表示不做质量分判断逻辑。
			req.setQualityScoreThreshold(50f);
			CompareFaceResponse resp = getAcsResponse(req);

			// 两张图片中的最大人脸属于同一个人的置信度，取值范围0~100。如果某张图片中没有人脸，则返回的置信度为0。
			log.info("FaceThanService resp={}" , JSON.toJSON(resp.getData()));
			if (resp.getCode() == null && resp.getData().getConfidence() >= faceConfig.getConfidence()) {
				return true;
			}

		} catch (Exception e) {
			log.error(e.getMessage(), e);
			return false;
		}
		return false;
	}

	/**
	 * 解析响应数据
	 * 
	 * @param req
	 * @return
	 * @throws Exception
	 * @author shun
	 * @date 2021年9月27日
	 */
	private <R extends RpcAcsRequest<T>, T extends AcsResponse> T getAcsResponse(R req) throws Exception {
		try {
			return client.getAcsResponse(req);
		} catch (ServerException e) {
			// 服务端异常
			log.warn(String.format("ServerException: errCode={}, errMsg={}", e.getErrCode(), e.getErrMsg()));
			throw e;
		} catch (ClientException e) {
			// 客户端错误
			log.warn(String.format("ClientException: errCode={}, errMsg={}", e.getErrCode(), e.getErrMsg()));
			throw e;
		} catch (Exception e) {
			log.warn("Exception:" + e.getMessage());
			throw e;
		}
	}
}
